#include "capacitor.h"
#include "fixed_parameter.h"
#include "math.h"


/**
 * @brief   构造函数
 * @param   c_value 电容容值（F)
 * @param   c_error 电容精度（±）
 * @param   c_voltage 电容耐压值
 */
capacitor::capacitor(double c_value, double c_error, double c_voltage)
{
    if (c_value <= 0)
    {
        value = 1e-9;
    }
    else value = c_value;

    if (c_error < 0)
    {
        error = 0;
    }
    else error = c_error;

    if (c_voltage <= 0)
    {
        withstand_voltage = 0;
    }
    else withstand_voltage = c_voltage;
}

/**
 * @brief   构造函数
 * @param   c_value 电容容值（F)
 * @param   c_error 电容精度（±）
 * @param   c_voltage 电容耐压值
 * @param   c_tcr 电容温度系数
 * @param   c_acr 电容老化系数
 */
capacitor::capacitor(double c_value, double c_error, double c_voltage, double c_tcr, double c_acr)
{
    capacitor(c_value, c_error, c_voltage);

    if (c_tcr < 0)
    {
        tcr = 0;
    }
    else tcr = c_tcr;

    if (c_acr < 0)
    {
        acr = 0;
    }
    else acr = c_acr;
}

void capacitor::set_value(double val)
{
    if (val <= 0)
    {
        return;
    }

    value = val;
}

void capacitor::set_error(double err)
{
    if (err <= 0)
    {
        return;
    }

    error = err;
}

void capacitor::set_withstand_vol(double v)
{
    if (v <= 0)
    {
        return;
    }

    withstand_voltage = v;
}

void capacitor::set_tcr(double c_tcr)
{
    if (c_tcr <= 0)
    {
        return;
    }

    tcr = c_tcr;
}

void capacitor::set_acr(double c_acr)
{
    if (c_acr <= 0)
    {
        return;
    }

    tcr = c_acr;
}



/**
 * @brief   获取电容的最大值
 * @param   max_work_temperature 最大工作温度
 * @param   max_work_life - 最大工作寿命
 */
double capacitor::get_max_value(double max_work_temperature, double max_work_life)
{
    double max_error = error;
    max_error += tcr * 10e-6 * (max_work_temperature - STANDARD_TEMPERATURE);
    max_error += acr * log10(max_work_life);

    return (1 + max_error) * value;
}

/**
 * @brief   获取电容的最小值
 * @param   max_work_temperature 最大工作温度
 * @param   max_work_life - 最大工作寿命
 */
double capacitor::get_min_value(double max_work_temperature, double max_work_life)
{
    double max_error = error;
    max_error += tcr * 10e-6 * (max_work_temperature - STANDARD_TEMPERATURE);
    max_error += acr * log10(max_work_life);

    return (1 - max_error) * value;
}

capacitor::~capacitor()
{

}




